package com.expert.miniapp.dao;

import com.expert.miniapp.dto.UserResourceLibraryDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * UserResourceLibraryMapper - 用户资源库数据访问接口
 *
 * @author System
 * @since 2025-10-28
 */
@Mapper
public interface UserResourceLibraryMapper {

    /**
     * 插入新资源到资源库
     *
     * @param library 资源库对象
     * @return 影响行数
     */
    int insert(UserResourceLibrary library);

    /**
     * 根据ID查询资源库记录
     *
     * @param libraryId 资源库ID
     * @return 资源库对象
     */
    UserResourceLibrary selectById(@Param("libraryId") String libraryId);

    /**
     * 检查资源是否已在用户资源库中，并返回libraryId
     *
     * @param userId 用户ID
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 如果存在，返回libraryId；如果不存在，返回null
     */
    String existsByUserAndResource(@Param("userId") String userId,
                                    @Param("resourceType") String resourceType,
                                    @Param("resourceId") String resourceId);

    /**
     * 查询用户的资源库列表（科研专家类型）- 带完整资源详情
     *
     * @param userId 用户ID
     * @param keyword 搜索关键词（可选）
     * @return 资源库DTO列表（按created_at倒序）
     */
    List<UserResourceLibraryDTO> findByUserIdAndType_Expert(@Param("userId") String userId,
                                                             @Param("keyword") String keyword);

    /**
     * 查询用户的资源库列表（科技成果类型）- 带完整资源详情
     *
     * @param userId 用户ID
     * @param keyword 搜索关键词（可选）
     * @return 资源库DTO列表（按created_at倒序）
     */
    List<UserResourceLibraryDTO> findByUserIdAndType_Achievement(@Param("userId") String userId,
                                                                  @Param("keyword") String keyword);

    /**
     * 查询用户的资源库列表（仪器设备类型）- 带完整资源详情
     *
     * @param userId 用户ID
     * @param keyword 搜索关键词（可选）
     * @return 资源库DTO列表（按created_at倒序）
     */
    List<UserResourceLibraryDTO> findByUserIdAndType_Instrument(@Param("userId") String userId,
                                                                 @Param("keyword") String keyword);

    /**
     * 查询用户的资源库列表（实验室类型）- 带完整资源详情
     *
     * @param userId 用户ID
     * @param keyword 搜索关键词（可选）
     * @return 资源库DTO列表（按created_at倒序）
     */
    List<UserResourceLibraryDTO> findByUserIdAndType_Laboratory(@Param("userId") String userId,
                                                                 @Param("keyword") String keyword);

    /**
     * 查询用户的资源库列表（其他资源类型）- 带完整资源详情
     *
     * @param userId 用户ID
     * @param keyword 搜索关键词（可选）
     * @return 资源库DTO列表（按created_at倒序）
     */
    List<UserResourceLibraryDTO> findByUserIdAndType_OtherResource(@Param("userId") String userId,
                                                                    @Param("keyword") String keyword);

    /**
     * 查询用户的所有资源库列表 - 不区分类型
     *
     * @param userId 用户ID
     * @param keyword 搜索关键词（可选）
     * @return 资源库DTO列表（按created_at倒序）
     */
    List<UserResourceLibraryDTO> findByUserIdAllTypes(@Param("userId") String userId,
                                                       @Param("keyword") String keyword);

    /**
     * 统计用户资源库中各类资源数量（只统计未删除的资源）
     *
     * @param userId 用户ID
     * @return 统计结果 Map，key为resource_type，value为数量
     */
    List<Map<String, Object>> countByUserIdGroupByType(@Param("userId") String userId);

    /**
     * 更新资源库备注
     *
     * @param libraryId 资源库ID
     * @param notes 新备注
     * @return 影响行数
     */
    int updateNotes(@Param("libraryId") String libraryId, @Param("notes") String notes);

    /**
     * 删除资源库记录
     *
     * @param libraryId 资源库ID
     * @return 影响行数
     */
    int deleteById(@Param("libraryId") String libraryId);

    /**
     * 根据libraryId查询资源库记录及资源完整详情（JOIN查询）
     *
     * @param libraryId 资源库ID
     * @return 资源库DTO（包含resourceDetails），不存在则返回null
     */
    UserResourceLibraryDTO findDetailById(@Param("libraryId") String libraryId);
}
